﻿/*
LICENCE___________________________________________________________________
    Copyright (C) 2012 Reverdy Sylvain

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
FIN LICENCE______________________________________________________________
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Merise_designer.Objets;

namespace Merise_designer.Methodes
{
    public class M_DictionnaireDeDonnees
    {
        private Donnees.CL_DictionnaireDeDonnees ddData = new Donnees.CL_DictionnaireDeDonnees();
        private List<Objets.CL_DictionnaireDeDonnees> mDIctionnaire = new List<CL_DictionnaireDeDonnees>();

        public void load()
        {
            Donnees.D_Type ddType = new Donnees.D_Type();

            String strType;
            foreach (System.Data.DataRow theRow in ddData.selectAll("monjeu").Tables["monjeu"].Rows)
            {
                strType = ddType.getType(int.Parse(theRow["TYPE_DIC"].ToString()), "monJeu").nom;
                Boolean pk = ddData.convertAccessToBool(int.Parse(theRow["PK"].ToString()));
                Boolean req = ddData.convertAccessToBool(int.Parse(theRow["REQ"].ToString()));
                mDIctionnaire.Add(new Objets.CL_DictionnaireDeDonnees(int.Parse(theRow["ID_DIC"].ToString()), theRow["NOM_DIC"].ToString(), theRow["CODE_DIC"].ToString(), int.Parse(theRow["TYPE_DIC"].ToString()), strType, theRow["ID_ASSO"].ToString(), theRow["ID_ENTITE"].ToString(), pk,req,getStringO(req),false));
            }
            ddData.setIdAuto(ddData.getNextIdAuto() - 1);
        }
        public void addSimpleEntite(ObjetsCommun controlleur,CL_Entite entite)
        {
            String strType = controlleur.getContructorType().get(3).nom;
            mDIctionnaire.Add(new Objets.CL_DictionnaireDeDonnees(ddData.getNextIdAuto(), 3, strType, entite));
            if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
            {
                ddData.addSimpleEntite(mDIctionnaire.Last());
            }
        }
        public void addSimpleAssociation(ObjetsCommun controlleur, Objets.CL_Association asso)
        {
            String strType = controlleur.getContructorType().get(3).nom;
            mDIctionnaire.Add(new Objets.CL_DictionnaireDeDonnees(ddData.getNextIdAuto(), 3, strType, asso));
            if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
            {
                ddData.addSimpleAssociation(mDIctionnaire.Last());
            }
        }
        public CL_DictionnaireDeDonnees getNewSimpleEntite(ObjetsCommun controlleur, CL_Entite entite)
        {
            String strType = controlleur.getContructorType().get(3).nom;
            return new Objets.CL_DictionnaireDeDonnees(ddData.getNextIdAuto(), 3, strType, entite);
        }
        public CL_DictionnaireDeDonnees getNewSimpleAssociation(ObjetsCommun controlleur, Objets.CL_Association asso)
        {
            String strType = controlleur.getContructorType().get(3).nom;
            return new Objets.CL_DictionnaireDeDonnees(ddData.getNextIdAuto(), 3, strType, asso);
        }
        public void add(ObjetsCommun controlleur,int id, string nom, string code, int idType, string idAsso, string idEntite, Boolean isPrimeryKey, Boolean isRequired,String strReq)
        {
            String strType = controlleur.getContructorType().get(idType).nom;
            mDIctionnaire.Add(new Objets.CL_DictionnaireDeDonnees(id==-1?ddData.getNextIdAuto():id, nom, code, idType, strType, idAsso, idEntite, isPrimeryKey, isRequired,strReq,false));
            if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
            {
                ddData.add(mDIctionnaire.Last());
            }
        }
        public void add(ObjetsCommun controlleur, CL_DictionnaireDeDonnees donnee)
        {
            this.add(controlleur,donnee.id, donnee.nom, donnee.code, donnee.idType, donnee.idAsso, donnee.idEntite, donnee.pk,donnee.O,getStringO(donnee.O));
        }
        public void update(Objets.CL_DictionnaireDeDonnees dico)
        {
            foreach (Objets.CL_DictionnaireDeDonnees d in mDIctionnaire)
            {
                if (d.id == dico.id)
                {
                    //ddData.addSimpleEntite(mDIctionnaire.Last());
                    if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
                    {
                        ddData.update(dico);
                    }
                    mDIctionnaire.Remove(d);
                    mDIctionnaire.Add(dico);
                    return;
                }
            }
            return;
        }
        public void deleteAll()
        {
            if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
            {
                ddData.deleteAll();
            }
            mDIctionnaire.Clear();
        }
        public void delete(int id)
        {
            foreach (Objets.CL_DictionnaireDeDonnees d in mDIctionnaire)
            {
                if (d.id == id)
                {
                    if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
                    {
                        ddData.delete(d);
                    }
                    mDIctionnaire.Remove(d);
                    return;
                }
            }
            return;
        }
        public void deleteAllFromEntite(Objets.CL_Entite entite)
        {
            List<CL_DictionnaireDeDonnees> listToDelete = new List<CL_DictionnaireDeDonnees>();
            foreach (Objets.CL_DictionnaireDeDonnees d in mDIctionnaire)
            {
                if (d.idEntite == entite.Id)
                {
                    listToDelete.Add(d);

                }
            }

            foreach (CL_DictionnaireDeDonnees d in listToDelete)
            {
                if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
                {
                    ddData.delete(d);
                }
                mDIctionnaire.Remove(d);

            }
        }
        public void deleteAllFromAssociation(Objets.CL_Association asso)
        {
            List<CL_DictionnaireDeDonnees> listToDelete = new List<CL_DictionnaireDeDonnees>();
            foreach (Objets.CL_DictionnaireDeDonnees d in mDIctionnaire)
            {
                if (d.idAsso == asso.Id)
                {
                    listToDelete.Add(d);
                }
            }

            foreach (CL_DictionnaireDeDonnees d in listToDelete)
            {
                if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
                {
                    ddData.delete(d);
                }
                mDIctionnaire.Remove(d);
            }

        }
        public List<Objets.CL_DictionnaireDeDonnees> selectAll()
        {
            return mDIctionnaire;
        }
        public Objets.CL_DictionnaireDeDonnees select(int id)
        {
            foreach (Objets.CL_DictionnaireDeDonnees d in mDIctionnaire)
            {
                if (d.id == id)
                {
                    return d;
                }
            }
            return null;
        }
        public List<Objets.CL_DictionnaireDeDonnees> selectAllFromEntite(Objets.CL_Entite entite, string monJeu)
        {
            List<Objets.CL_DictionnaireDeDonnees> result = new List<CL_DictionnaireDeDonnees>();
            foreach (Objets.CL_DictionnaireDeDonnees d in mDIctionnaire)
            {
                if (d.idEntite == entite.Id)
                {
                    result.Add(d);
                }
            }
            return result;
        }
        public List<Objets.CL_DictionnaireDeDonnees> selectAllFromAssociation(Objets.CL_Association asso, string monJeu)
        {
            if (asso == null) return null;
            List<Objets.CL_DictionnaireDeDonnees> result = new List<CL_DictionnaireDeDonnees>();
            foreach (Objets.CL_DictionnaireDeDonnees d in mDIctionnaire)
            {
                if (d.idAsso == asso.Id)
                {
                    result.Add(d);
                }
            }
            return result;
        }

        public String getStringO (Boolean req)
        {
            if (req) return CL_DictionnaireDeDonnees.NOT_NULL;
            return CL_DictionnaireDeDonnees.NULL;
        }
    }
}
